package Solution.problem048;

/**
 * @program Leetcode
 * @description:
 * 旋转90°即：A[0,0] 转到 A[0,n] 位置；A[0,n] 转到 A[n,n] 位置；A[n,n] 转到 A[n,0] 位置；A[n,0] 转到 A[0,0] 位置。
 * 然后依次类推上一步操作的是最外层的一层 环，我们只需要一层层往里执行相同的操作，最终即可完成整个矩阵的旋转
 * 假设矩阵是 n*n 的，那么我们对 n/2 个环执行旋转即可完成
 * 对于任一层的环，假如其实索引为 start，终止索引为 end，那么左上右下四个点分别可有表示为：A[start][start]，A[start][end]，A[end][start]，A[end][end]
 * 原文：https://blog.csdn.net/afei__/article/details/84242702
 * 版权声明：本文为博主原创文章，转载请附上博文链接！
 * @author: lishangsheng
 * @create: 2019/04/01 11:05
 */
public class Solution {
    private static void rotate(int[][] matrix) {
        int len = matrix.length;
        for (int i = 0; i < len / 2; i++) {
            int start = i; // 当前环的起始下标（横纵均相等）
            int end = len - i - 1; // 当前环的终点下标（横纵均相等）
            for (int j = 0; j < end - start; j++) {
                int temp = matrix[start][start + j];
                matrix[start][start + j] = matrix[end - j][start];
                matrix[end - j][start] = matrix[end][end - j];
                matrix[end][end - j] = matrix[start + j][end];
                matrix[start + j][end] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix_3x3 = { { 1, 2, 3 },
                { 4, 5, 6 },
                { 7, 8, 9 } };
        rotate(matrix_3x3);
        printMatrix(matrix_3x3);
        System.out.println("*****************************");
        int[][] matrix_4x4 = { { 5,  1,  9,  11 },
                { 2,  4,  8,  10 },
                { 13, 3,  6,  7  },
                { 15, 14, 12, 16 } };
        rotate(matrix_4x4);
        printMatrix(matrix_4x4);
    }
    private static void printMatrix(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j] + "\t");
            }
            System.out.println();
        }
    }

}
